/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package radiostation;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import model.*;
import java.util.List;
import javax.persistence.EntityManager;
import java.io.File;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
/**
 *
 * @author Sotos
 */
public class ExportListToXml extends javax.swing.JFrame {
    
       private final DateFormat dateformat; 
       Song song;
    /**
     * Creates new form ExportListToXml
     * 
     */
    public ExportListToXml() {
        
        dateformat = new SimpleDateFormat("yyyy-MM-dd"); 
    };
    
    //φτειάχνουμε καινούργιο δημιουργό με παράμετρο την playlist 
    public ExportListToXml(Playlist pl) {
        
        dateformat = new SimpleDateFormat("yyyy-MM-dd"); 
        this.pl= pl;
         em =DBManager.em;
         if ( !(em.getTransaction().isActive()) ){
            em.getTransaction().begin();
        }
        initComponents();
        DBManager.centerOnScreen(this); 
       }
    
// μεθοδος που εκτελεί query για την αναζήτηση της Playlist  παράμετρο το id
 public List  findWithId(long id){
            return em.createQuery("select p from Playlist p where p.id = :id  ").
                    setParameter("id", id).getResultList();
                }
 
 // μεθοδος που εκτελεί query για την αναζήτηση του αντικειμένου, που περιέχει 
 // το όνομα του συγκροτήματος ή το καλλιτεχνικό του καλλιτέχνη,
 //με παραμέτρους, τον τίτλο του τραγουδιού και το foreign key του αλμπουμ
 public Object findNameWithFidandTitle(int falbId , String title){
    return em.createQuery(
            "select so.falbumId.fartistId.artisticname from Artist art, Album al, Song so "+
              "where so.title like :songtitle and so.falbumId.id = :fid "      
            +               "union "
              +"select so.falbumId.fgroupId.name from Musicgroup mu, Song so "+
              "where so.title like :songtitle and so.falbumId.id = :fid")     
            .setParameter("songtitle",'%' + title + '%')
            .setParameter("fid", falbId).getResultList();
   }
     /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jLabel3 = new javax.swing.JLabel();
        jLabel1 = new javax.swing.JLabel();
        jButton1 = new javax.swing.JButton();
        jTextField1 = new javax.swing.JTextField();
        jLabel2 = new javax.swing.JLabel();
        jButton2 = new javax.swing.JButton();
        jLabel4 = new javax.swing.JLabel();
        jLabel5 = new javax.swing.JLabel();

        jLabel3.setText("jLabel3");

        setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE);
        setTitle("Δημιουργία αρχείου XML");

        jLabel1.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N
        jLabel1.setForeground(new java.awt.Color(102, 102, 255));
        jLabel1.setText("Εξαγωγή Λίστας Τραγουδιών σε Αρχείο XML");

        jButton1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/images/File-Code-XML-icon.png"))); // NOI18N
        jButton1.setText("Εξαγωγή / Aποθήκευση");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        jLabel2.setForeground(new java.awt.Color(255, 51, 51));
        jLabel2.setText(" Όνομα αρχείου, χωρίς την κατάληξη .xml ");
        jLabel2.setPreferredSize(new java.awt.Dimension(280, 14));

        jButton2.setIcon(new javax.swing.ImageIcon(getClass().getResource("/images/gnome_logout.png"))); // NOI18N
        jButton2.setText("Επιστροφή");
        jButton2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton2ActionPerformed(evt);
            }
        });

        jLabel4.setText("Το Αρχείο XML θα δημιουργηθεί στον κατάλογο:");

        jLabel5.setText("~ NetBeansProjects\\RadioStation");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addGroup(layout.createSequentialGroup()
                                .addContainerGap()
                                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                                    .addComponent(jTextField1)
                                    .addGroup(layout.createSequentialGroup()
                                        .addComponent(jButton1)
                                        .addGap(19, 19, 19)
                                        .addComponent(jButton2))))
                            .addGroup(layout.createSequentialGroup()
                                .addGap(39, 39, 39)
                                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                    .addComponent(jLabel4, javax.swing.GroupLayout.PREFERRED_SIZE, 271, javax.swing.GroupLayout.PREFERRED_SIZE)
                                    .addComponent(jLabel5, javax.swing.GroupLayout.PREFERRED_SIZE, 271, javax.swing.GroupLayout.PREFERRED_SIZE)
                                    .addGroup(layout.createSequentialGroup()
                                        .addGap(8, 8, 8)
                                        .addComponent(jLabel1)))))
                        .addGap(0, 0, Short.MAX_VALUE))
                    .addGroup(layout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(jLabel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jLabel1)
                .addGap(18, 18, 18)
                .addComponent(jLabel4)
                .addGap(1, 1, 1)
                .addComponent(jLabel5)
                .addGap(18, 18, 18)
                .addComponent(jLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(1, 1, 1)
                .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jButton2, javax.swing.GroupLayout.PREFERRED_SIZE, 41, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jButton1))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed
        // TODO add your handling code here:
         if (jTextField1.getText().isEmpty()) {
            JOptionPane.showMessageDialog(null, "Προσοχή το πεδίο δεν έχει συμπληρωθεί!", "ERROR", JOptionPane.ERROR_MESSAGE);
        } else {
             try{ //Αρχίζει η διαδικασία δημιουργίας του xml , με αρχικοποίηση του DocumentBuilderFactory 
             DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
	     DocumentBuilder docBuilder = docFactory.newDocumentBuilder();	
             Document doc = docBuilder.newDocument();
	     Element rootElement = doc.createElement("Playlist");
	     doc.appendChild(rootElement);
             
       
             long id = pl.getId();// εξαδωγή του id της λιστας που πέρασε 
             //σαν παράμετρος απο την καλούσα φόρμα
             
             List<Playlist> results= findWithId(id);//εύρεση της σωστής λίστας
             //με τα τραγούδια
           
             for(Playlist p : results)//χτίσιμο του δένδρου xml
       
             {  //list element
             Element list = doc.createElement("list");
             rootElement.appendChild(list);
             
             //set attribute to list element
             Attr attr = doc.createAttribute("id");
             attr.setValue(Long.toString(p.getId()));
             list.setAttributeNode(attr);
             
             //name element
             Element name= doc.createElement("name");
             name.appendChild(doc.createTextNode(p.getName()));
            list.appendChild(name);
            
            //description element
            Element description= doc.createElement("description");
             description.appendChild(doc.createTextNode(p.getDescription()));
            list.appendChild(description);
            
            //creationdate element
            Element creationdate= doc.createElement("creationdate");
            creationdate.appendChild(doc.createTextNode(dateformat.format((p.getCreationdate())))); 
            list.appendChild(creationdate);
            
            ///////////////////////////////////////////////
            //creation element of songlist
            
             List<Song> songlist=   p.getSongList();
             for(Song so : songlist){
               // \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
             ///εύρεση του foreign key του κατάλληλου άλμπουμ...
             long falbId=so.getFalbumId().getId();//...και του κατάλληλου τίτλου
             
             String songtitle=so.getTitle(); //...τραγουδιού...
             //..για να περαστούν ως παράμετροι παρακάτω...
            Object  artObj = findNameWithFidandTitle((int)falbId , songtitle);//και...
            
           
            String artisname= artObj.toString();//...να επιστραφεί το όνομα του 
            //συγροτήματος ή του καλλιτέχνη
             
            System.out.println(artisname);
            /////////////////////////////////////////////
            //\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\  
            
             //song element
             Element sonng = doc.createElement("song");
             rootElement.appendChild(sonng);
         
             //set attribute to list element
             Attr attrid = doc.createAttribute("id");
             attrid.setValue(Long.toString(so.getId()));
             sonng.setAttributeNode(attrid);  
             
             //artname element
             Element artisticname =doc.createElement("artisticname");
             artisticname.appendChild(doc.createTextNode(artisname));
             sonng.appendChild( artisticname);
             
             //title element
               Element title = doc.createElement("title");
             title.appendChild(doc.createTextNode(so.getTitle()));
             sonng.appendChild(title);
          
             //duration element
              Element dur = doc.createElement("duration");
             dur.appendChild(doc.createTextNode(Long.toString(so.getDuration())));
             sonng.appendChild(dur); 
                           
             //trackno element
             Element track = doc.createElement("trackno");
             track.appendChild(doc.createTextNode(so.getTrackno()));
             sonng.appendChild(track);   
             System.out.println("FalbumId = "+ so.getFalbumId());
                          }
                   }
             
                // εγγραφή δομής xml δένδρου σε αρχείο
		TransformerFactory transformerFactory = TransformerFactory.newInstance();
		Transformer transformer = transformerFactory.newTransformer();
		DOMSource source = new DOMSource(doc);
	
                //διαβάζει το όνομα του αρχείου ...
                String string = jTextField1.getText();
                System.out.println("The  file saved as :"+ string+".xml");   
                StreamResult result; 
               
                //...και του βάζει την κατάληξη .xml
                result = new StreamResult(new File(string + ".xml"));
		transformer.transform(source, result);
                 
		System.out.println("File saved!");
                MyWindowEvent we = new MyWindowEvent(this, WindowEvent.WINDOW_CLOSED, true);
        for (WindowListener l : this.getWindowListeners()){
            l.windowClosed(we);
        }
        this.setVisible(false);
 
	  } catch (ParserConfigurationException pce) {
		pce.printStackTrace();
	  } catch (TransformerException tfe) {
		tfe.printStackTrace();
	  }
        } 
    }//GEN-LAST:event_jButton1ActionPerformed

    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton2ActionPerformed
        // TODO add your handling code here:
        this.setVisible(false);
    }//GEN-LAST:event_jButton2ActionPerformed

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton2;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JTextField jTextField1;
    // End of variables declaration//GEN-END:variables
EntityManager em;
JFrame thisFrame;
private model.Playlist pl;
}
